<article class="manual_1" id="overview">
<h1>
  <span lang="en">PG-Strom Overview</span>
  <span lang="ja">PG-Strom概要</span>
</h1>
<p>
<span lang="en">
This chapter introduces a brief overview of PG-Strom and developer community.
</span>
<span lang="ja">
本章では、PG-Stromの概要、および開発者コミュニティについて紹介します。
</span>
</p>

<section class="manual_2" id="what_is_pgstrom">
<h2>
  <span lang="en">What is PG-Strom</span>
  <span lang="ja">PG-Stromとは？</span>
</h2>
<p>
<span lang="en">
PG-Strom is an extension designed for PostgreSQL v9.5 or later, to off-load a part of CPU intensive workloads to GPU (Graphic Processor Unit) devices, and execute them in parallel asynchronously.
This module is designed to reduce response time of complicated queries executed on large data set (like, data analytics or batch processing), on the other hands, it is not preferable to run transactional workloads or heavy concurrent processing.
</span>
<span lang="ja">
PG-Stromとは、PostgreSQL v9.5および以降のバージョン向けに設計された拡張モジュールで、ユーザやアプリケーションからは透過的に、CPU負荷が中心となるSQLワークロードの一部をGPU(Graphic Processor Unit)デバイス上で非同期・並列実行する事を可能にします。
本モジュールは大規模なデータセット上で実行される複雑なクエリ（典型例としてはデータ解析やバッチ処理が該当します）の応答時間を短縮する事を目的として設計されていますが、更新系や同時多重処理には向いていません。
</span>
<span lang="en">
The core idea of PG-Strom is, the code generator that constructs GPU native binaries according to the supplied SQL queries on the fly and transparently, and execution engine that runs the GPU native binaries to the massive input data stream in parallel and asynchronously.
These mechanisms enable to pull out capability of GPU devices that mount multi-hundred to multi-thousand cores per chip, to process the massive amount of records, transparently from the standpoint of users or applications.
</span>
<span lang="ja">
PG-Stromの中核を成すのは、SQL構文に対応したGPU用バイナリ命令列を動的かつ透過的に生成しコードジェネレータと、これを並列プロセッサで大量の入力データに対して非同期・並列実行する実行エンジンです。
これらの機能により、ユーザやアプリケーションの視点からは透過的に、数百～数千コアが実装されたGPUデバイスの能力を大量のレコードを処理するために利用する事が可能となります。
</span>
<span lang="en">
We define the role of PG-Strom is an intermediation between PostgreSQL and the recent evolution of semiconductor like GPU or SSD (Solid State Drive).
</span>
<span lang="ja">
我々自身は、GPUやSSD(Solit State Drive)といった近年の半導体技術の進化と、PostgreSQLの間を橋渡しする事がPG-Stromの役割であると考えています。
</span>
</p>

<!--
ここに絵がほしいな
-->

<section class="manual_3" id="pgstrom-features">
<h3>
<span lang="en">Features of PG-Strom</span>
<span lang="ja">PG-Stromの機能</span>
</h3>

<p>
<span lang="en">
PG-Strom support the following SQL workloads.
</span>
<span lang="ja">
PG-Stromは以下のSQLワークロードに対応したいます。
</span>
</p>

<dl>
<dt>
<span lang="en">Full Table Scan</span>
<span lang="ja">全件スキャン</span>
</dt>
<dd>
<span lang="en">
On full table scan with scan qualifiers, GPU runs evaluation of scan qualifier and filter out invisible rows.
</span>
<span lang="ja">
条件句を含むテーブルの全件スキャンにおいて、条件句の評価と行の絞り込みをGPU側で行います。
</span>
</dd>

<dt>
<span lang="en">Tables Join</span>
<span lang="ja">ジョイン</span>
</dt>
<dd>
<span lang="en">
GPU runs relations joins. Parallel version of hash-join algorithm and simple (none parameterized) nest-loop algorithm are supported. It have advantages to relations join between a large table and relatively small tables; that expects fact-master table schema design we usually use transactional systems.
</span>
<span lang="ja">
テーブル同士の結合をGPU側で処理します。Hash-Joinアルゴリズムと単純Nest-Loopアルゴリズムが実装されており、非常に大きな一個のテーブルと、比較的サイズの小さな複数個のテーブルの結合において特に効果を発揮します。
これは一般的なトランザクションシステムで用いられる、ファクトテーブル－マスターテーブル構成を意図しています。
</span>
</dd>

<dt>
<span lang="en">Group By/Aggregation</span>
<span lang="ja">集約演算</span>
</dt>
<dd>
<span lang="en">
GPU runs pre-processing of aggregate operations, to reduce the number of rows to be processed by CPU.
In case when we make 1000 groups from 10 million rows and compute average of each group, for example, GPU can load a data chunk per million rows then return the number of rows and total sum for each groups, in the result, all CPU needs to process will be just 10,000 rows.
</span>
<span lang="ja">
GPU側で集約演算の前処理を行い、CPUが処理すべき行数を削減します。
例えば、1000万行から1000グループを抽出し、各グループの平均値を算出するとします。100万行ずつGPUにデータをロードし、1000グループ毎にレコード件数と総和を計算すれば、結果、CPUが処理しなければならない行数は僅か1万行という事になります。
</span>
</dd>

<!--
<dt>
<span lang="en">Sort</span>
<span lang="ja">ソート</span>
</dt>
<dd>
<span>
GPUとCPUの両方を用いてデータの整列を行います。GPU側ではBitonic Sortingが、CPU側ではMerge Sortが実装されており、これらを組み合わせにより整列処理を行います。
</span>
</dd>
-->

<dt>
<span lang="en">Projection</span>
<span lang="ja">プロジェクション</span>
</dt>
<dd>
<span lang="en">
When SQL query contains complicated mathematical formulas, GPU runs calculation of these expression on the device, then CPU just references the calculated results.
It has advantages to execute statistical analytics workloads on SQL.
</span>
<span lang="ja">
問合せが複雑な数式の計算を含む場合に、GPU側で計算処理を行い、CPU側では計算済みの結果を参照するようにします。統計解析処理をSQLで実行する時に効果を発揮します。
</span>
</dd>
</dl>

<p>
<span lang="en">
PG-Strom supports the data types below. See the %%%PGSTROM_MANUAL_XLINK:reference_types%%% for more details.
</span>
<span lang="ja">
PG-Stromは以下のデータ型に対応しています。詳細は %%%PGSTROM_MANUAL_XLINK:reference_types%%% を参照してください。
</span>
</p>
<dl>
<dt>
<span lang="en">Numeric Data Types</span>
<span lang="ja">数値データ型</span>
</dt>
<dd>
<span>
<code>smallint</code>, <code>int</code>, <code>bigint</code>,
<code>real</code>, <code>float</code> and <code>numeric</code></span>
</dd>
<dt>
<span lang="en">Date and Time</span>
<span lang="ja">日付時刻型</span>
</dt>
<dd>
<span>
<code>date</code>, <code>time</code>, <code>timetz</code>,
<code>timestamp</code>, <code>timestamptz</code> and <code>interval</code>
</span>
</dd>
<dt>
<span lang="en">Text</span>
<span lang="ja">文字列型</span>
</dt>
<dd>
<span>
<code>char(n)</code>, <code>varchar(n)</code>,
<code>text</code> and <code>bytea</code></span>
</dd>
<dt>
<span lang="en">Others</span>
<span lang="ja">その他</span>
</dt>
<dd>
<span><code>bool</code>, <code>money</code></span>
</dd>
</dl>

<p>
<span lang="en">
PG-Strom supports the functions and operators below. See %%%PGSTROM_MANUAL_XLINK:reference_functions%%% for more details.
</span>
<span lang="ja">
PG-Stromは以下の関数・演算子に対応しています。詳細は %%%PGSTROM_MANUAL_XLINK:reference_functions%%% を参照してください。
</span>
</p>

<dl>
<dt>
<span lang="en">Arithmetic operations</span>
<span lang="ja">算術演算子</span>
</dt>
<dd>
<span lang="en">
It supports four arithmetic operations (<code>+</code>, <code>-</code>, <code>*</code>, <code>/</code>), logical operations (<code>&</code>, <code>|</code>) and so on for each data type.
</span>
<span lang="ja">
それぞれ対応するデータ型ごとに、四則演算(<code>+</code>, <code>-</code>, <code>*</code>, <code>/</code>)や、論理演算(<code>&</code>, <code>|</code>)などに対応しています。
</span>
</dd>

<dt>
<span lang="en">Comparison operations</span>
<span lang="ja">比較演算子</span>
</dt>
<dd>
<span lang="en">
It supports larger/smaller comparison operators (<code>=</code>, <code>&lt;&gt;</code>, <code>&lt;</code>, <code>&lt;=</code>, <code>&gt;</code>, <code>&gt;=</code>) for each data type.
Especially, equivalent operators (<code>=</code>) are internally used by join or aggregation.
</span>
<span lang="ja">
それぞれ対応するデータ型ごとに、大小比較演算(<code>=</code>, <code>&lt;&gt;</code>, <code>&lt;</code>, <code>&lt;=</code>, <code>&gt;</code>, <code>&gt;=</code>)に対応しています。
特に等価演算子(<code>=</code>)は、ジョインや集約演算の内部処理においても使用されます。
</span>
</dd>

<dt>
<span lang="en">Mathematical functions</span>
<span lang="ja">数学関数</span>
</dt>
<dd>
<span lang="en">
Various mathematical functions that take <code>float</code> arguments are supported, like <code>sqrt</code>, <code>ln</code>, <code>pow</code>, <code>sin</code>.
</span>
<span lang="ja">
<code>sqrt</code>, <code>ln</code>, <code>pow</code>, <code>sin</code>など、<code>float</code>型を引数に取る数学関数の多くに対応しています。
</span>
</dd>

<dt>
<span lang="en">Aggregate functions</span>
<span lang="ja">集約関数</span>
</dt>
<dd>
<span lang="en">
Aggregate functions like <code>min</code>, <code>max</code>, <code>avg</code>, <code>sum</code>, <code>stddev</code> and etc are supported.
</span>
<span lang="ja">
<code>min</code>, <code>max</code>, <code>avg</code>, <code>sum</code>, <code>stddev</code>などの集約関数に対応しています。
</span>
</dd>

<dt>
<span lang="en">Pattern Matching</span>
<span lang="ja">パターンマッチング</span>
</dt>
<dd>
<span lang="en">
<code>LIKE</code> operators is supported for pattern matching.
</span>
<span lang="ja">
<code>LIKE</code>句によるパターンマッチングに対応しています。
</span>
</dd>
</dl>
</section>

<section class="manual_3" id="pgstrom-license">
<h3>
  <span lang="en">License</span>
  <span lang="ja">ライセンス</span>
</h3>
<p>
<span lang="en">
PG-Strom is distributed under the GPLv2 (GNU Public License version 2). You can use, modify and redistribute the software freely, according to the license terms. Please reference the <code>LICENSE</code> file bundled in the software.
Also note that PG-Strom has no warranty, and PG-Strom Development Team is not liable for any damage resulting from the use of this software.
</span>
<span lang="ja">
PG-StromはGPLv2(GNU Public License version 2)下で配布されており、ライセンス条項に従い、ソフトウェアを自由に利用、改変、再配布することができます。詳細は、ソフトウェアに同梱の<code>LICENSE</code>を参照してください。
また、PG-Stromは無保証であり、本ソフトウェアを用いた結果生じたいかなる損害に対してもPG-Strom Development Teamは責任を有しません。
</span>

</p>
</section>
</section>

<section class="manual_2" id="pgstrom-community">
<h2>
  <span lang="en">Our Community</span>
  <span lang="ja">コミュニティ</span>
</h2>
<p>

<span lang="en">
Development of PG-Strom stands on the master Git repository: <a href="https://github.com/pg-strom/devel" target="_blank">https://github.com/pg-strom/devel.git</a>.
</span>
<span lang="ja">
PG-Stromの開発は、Gitリポジトリ <a href="https://github.com/pg-strom/devel" target="_blank">https://github.com/pg-strom/devel.git</a> を中心にして行われています。
</span>
</p>
<p>
<span lang="en">
Please open an issue on the issue tracker (<a href="https://github.com/pg-strom/devel/issues" target="_blank">https://github.com/pg-strom/devel/issues</a>) for bug report, new feature request, questions and so on.
It is preferable to assign proper tags like "bug", "question" and etc...
</span>
<span lang="ja">
バグの報告、新機能の要望、質問などは、イシュートラッカー(<a href="https://github.com/pg-strom/devel/issues" target="_blank">https://github.com/pg-strom/devel/issues</a>)でイシューをオープンしてください。『bug』、『question』などの適切なタグを付ける事が望ましいです。
</span>
</p>
<p>
<span lang="en">
PG-Strom is developed by PG-Strom Development Team, and they also hold its copyright. However, it does not mean you have to assign your copyright, because PG-Strom Development Team is not a legal entity, a generic name of all the contributors for PG-Strom development. It is a same way that Linux kernel, PostgreSQL and many other open source project works.
</span>
<span lang="ja">
PG-StromはPG-Strom Development Teamによって開発され、同時に著作権を保持しています。しかし、これはパッチの投稿に際してあなたに著作権の放棄を要求してはいません。PG-Strom Development Teamは法的主体ではなく、PG-Stromの開発に貢献した全ての開発者の総称であるからです。これは、Linux kernelやPostgreSQLなど他のOSSプロジェクトと同様です。
</span>
</p>
</section>
</article>
